﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Web;

namespace IQReportes.Models.Logica
{
    /// <summary>
    /// lógica de parámetros
    /// </summary>
    public class LogicaParametro
    {
        /// <summary>
        /// objeto de acceso a bd para la tabla relacionada a parámetros
        /// </summary>
        ParametroDAO db = new ParametroDAO();
        /// <summary>
        /// obtener día inical de vista transacciones
        /// </summary>
        /// <returns>día inical de vista transacciones</returns>
        public int getDiasInicialTx()
        {
            return db.parametros.Where(x => x.vcNombre.CompareTo("DiasFinalTx") == 0)
                .First().inValor;
        }
        /// <summary>
        /// obtener rango máximo de selección de fechas personalizadas para vista de transacciones
        /// </summary>
        /// <returns>rango máximo de selección de fechas personalizadas</returns>
        public int getRangoDiasCustomizado()
        {
            return db.parametros.Where(x => x.vcNombre.CompareTo("RangoDiasTx") == 0)
                .First().inValor;
        }
        /// <summary>
        /// obtener día inicial para panel de control
        /// </summary>
        /// <returns>día inicial para panel de control</returns>
        public int getDiasInicialPC()
        {
            return db.parametros.Where(x => x.vcNombre.CompareTo("DiasInicialPC") == 0)
                .First().inValor;
        }
        /// <summary>
        /// obtener fecha final formateada para vista de transacciones
        /// </summary>
        /// <returns>fecha final formateada para vista de transacciones</returns>
        public string getFechaFinalStringTx()
        {
            int restarDias = getDiasInicialTx();
            DateTime fecha = DateTime.Now.AddDays(restarDias*-1);
            return String.Format("{0:dd/MM/yyyy}", fecha);   
        }
        /// <summary>
        /// obtener fecha final formato fecha para vista de transacciones
        /// </summary>
        /// <returns>fecha final formato fecha para vista de transacciones</returns>
        public DateTime getFechaFinalTx()
        {
            int restarDias = getDiasInicialTx();
            DateTime fecha = DateTime.Now.AddDays(restarDias * -1);
            return fecha;
        }
        /// <summary>
        /// obtener fecha de rango inicial para vista de transacciones
        /// </summary>
        /// <returns>fecha de rango inicial para vista de transacciones</returns>
        public string getFechaRangoInicialStringTx()
        {
            int restarDias = getDiasInicialTx() +getRangoDiasCustomizado();
            DateTime fecha = DateTime.Now.AddDays(restarDias*-1);
            return String.Format("{0:dd/MM/yyyy}", fecha);
        }
        /// <summary>
        /// obtener fecha inicial formateada para panel de control
        /// </summary>
        /// <returns>fecha inicial formateada para panel de control</returns>
        public string getFechaInicialStringPC()
        {
            int restarDias = getDiasInicialPC();
            DateTime fecha = DateTime.Now.AddDays(restarDias*-1);
            return String.Format("{0:dd/MM/yyyy}", fecha);
        }
        /// <summary>
        /// obtener fecha final formato fecha para panel de control ,donde fecha final PC para este caso es igual a la fecha inicial
        /// </summary>
        /// <returns>fecha final formato fecha para panel de control</returns>
        public DateTime getFechaFinalPC()
        {
            int restarDias = getDiasInicialPC();
            DateTime fecha = DateTime.Now.AddDays(restarDias * -1);
            return fecha;
        }
        /// <summary>
        /// obtener la fecha inicial de todo el sistema
        /// </summary>
        /// <returns>fecha inicial de todo el sistema</returns>
        public string getFechaInicialTodo()
        {
            return db.parametros.Where(x => x.vcNombre.CompareTo("FechaInicialTodo") == 0).First().vcValor;
        }
        /// <summary>
        /// obtener path del archivo para guardar los archivos subidos
        /// </summary>
        /// <returns>path del archivo</returns>
        public string getPath(){
            return db.parametros.Where(x => x.vcNombre.CompareTo("PathArchivo") == 0).First().vcValor;
        }
        /// <summary>
        /// obtener información sobre la ultima actualización
        /// </summary>
        /// <returns>información sobre la ultima actualización</returns>
        public string getDataUltimaActualizacion()
        {
            var param = db.parametros.ToList();
            var parametro = db.parametros.Where(x => x.vcNombre.Equals("ultimaActualizacion")).First(); 
            string fecha = parametro.vcValor;
            string usuario = (new LogicaUsuario()).getNombreUsuarioById(parametro.inValor);
            string fechaArchivo = parametro.vcTipo;
            var sb = new StringBuilder();
            string respuesta ="Última carga de archivo: {0}. Fecha del archivo cargado: {1} por el usuario {2}";
            sb.AppendFormat(respuesta,fecha,fechaArchivo,usuario);
            return sb.ToString();
        }
        /// <summary>
        /// obtener el estado del proceso batch ( si se encuentra corriendo o detenido)
        /// </summary>
        /// <returns>estado del proceso batch</returns>
        public bool getEstadoProcesoBatch()
        {
            var estado = db.parametros.Where(x => x.vcNombre.Equals("EstadoBatch")).First().inValor;
            return estado == 1;
        }
        /// <summary>
        /// guardar la ultima actualización realizada a partir de un archivo
        /// </summary>
        /// <param name="fechaFormato">fecha de actualización</param>
        /// <param name="idUsuario">id de usuario que realizó la actualización</param>
        public void guardarUltimaActualizacion(DateTime fechaFormato, int idUsuario)
        {
            DateTime ahora = DateTime.Now;
            string fechaActual = String.Format("{0:dd/MM/yyyy}", ahora);
            var parametro = db.parametros.Where(x => x.vcNombre.Equals("ultimaActualizacion")).First();
            parametro.inValor = idUsuario;
            parametro.vcValor = fechaActual;
            parametro.vcTipo = String.Format("{0:dd/MM/yyyy}", fechaFormato);
            db.Entry(parametro).State = EntityState.Modified;
            db.SaveChanges();
        }
    }
}